struct Dog {
	name string
	age  int
}

struct Cat {
	name string
	age  int
}

interface Animal {
	say(s string)
	greet() int
}

fn (d Dog) say(s string) { println('Dog $d.name: "$s"') }
fn (c Cat) say(s string) { println('Cat $c.name: "$s"') }

fn (d Dog) greet() int { d.say('Hello!') return d.age }
fn (c Cat) greet() int { c.say('Hello!') return c.age }

fn use(a Animal) {
	if a is Dog { println('dog') }
	else if a is Cat { println('cat') }
	else { println('its a bug!') }
}

use(Dog{ 'Doggo', 5 })
use(Cat{ 'Nyancat', 6 })